/**
 * Copyright 2012 
 * 
 * Nicolas Desjardins  
 * https://github.com/mrKlar
 * 
 * Facilite solutions
 * http://www.facilitesolutions.com/
 * 
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package ca.laplanete.mobile.example;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;

public class PagedDragDropGrid extends HorizontalScrollView implements PagedContainer {

	private int mActivePage = 0;
	private DragDropGrid grid;
	private PagedDragDropGridAdapter adapter;
	private OnClickListener listener;

	public PagedDragDropGrid(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initPagedScroll();
		initGrid();
	}

	public PagedDragDropGrid(Context context, AttributeSet attrs) {
		super(context, attrs);
		initPagedScroll();
		initGrid();
	}

	public PagedDragDropGrid(Context context) {
		super(context);
		initPagedScroll();
		initGrid();
	}

	public PagedDragDropGrid(Context context, AttributeSet attrs, int defStyle, PagedDragDropGridAdapter adapter) {
		super(context, attrs, defStyle);
		this.adapter = adapter;
		initPagedScroll();
		initGrid();
	}

	public PagedDragDropGrid(Context context, AttributeSet attrs, PagedDragDropGridAdapter adapter) {
		super(context, attrs);
		this.adapter = adapter;
		initPagedScroll();
		initGrid();
	}

	public PagedDragDropGrid(Context context, PagedDragDropGridAdapter adapter) {
		super(context);
		this.adapter = adapter;
		initPagedScroll();
		initGrid();
	}

	private void initGrid() {
		grid = new DragDropGrid(getContext());
		addView(grid);
	}

	public void initPagedScroll() {

		setScrollBarStyle(SCROLLBARS_INSIDE_OVERLAY);

		setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
					int scrollX = getScrollX();
					int onePageWidth = v.getMeasuredWidth();
					int page = ((scrollX + (onePageWidth / 2)) / onePageWidth);
					scrollToPage(page);
					return true;
				} else {
					return false;
				}
			}
		});
	}

	public void setAdapter(PagedDragDropGridAdapter adapter) {
		this.adapter = adapter;
		grid.setAdapter(adapter);
		grid.setContainer(this);
	}

	public void setClickListener(OnClickListener l) {
		this.listener = l;
		grid.setOnClickListener(l);
	}

	public boolean onLongClick(View v) {
		return grid.onLongClick(v);
	}

	public void notifyDataSetChanged() {
		removeAllViews();
		initGrid();
		grid.setAdapter(adapter);
		grid.setContainer(this);
		grid.setOnClickListener(listener);
	}

	@Override
	public void scrollToPage(int page) {
		mActivePage = page;
		int onePageWidth = getMeasuredWidth();
		int scrollTo = page * onePageWidth;
		smoothScrollTo(scrollTo, 0);
	}

	@Override
	public void scrollLeft() {
		int newPage = mActivePage - 1;
		if (canScrollToPreviousPage()) {
			scrollToPage(newPage);
		}
	}

	@Override
	public void scrollRight() {
		int newPage = mActivePage + 1;
		if (canScrollToNextPage()) {
			scrollToPage(newPage);
		}
	}

	@Override
	public int currentPage() {
		return mActivePage;
	}

	@Override
	public void enableScroll() {
		requestDisallowInterceptTouchEvent(false);
	}

	@Override
	public void disableScroll() {
		requestDisallowInterceptTouchEvent(true);
	}

	@Override
	public boolean canScrollToNextPage() {
		int newPage = mActivePage + 1;
		return (newPage < adapter.pageCount());
	}

	@Override
	public boolean canScrollToPreviousPage() {
		int newPage = mActivePage - 1;
		return (newPage >= 0);
	}
}
